package uu.game.majiang.core;

/**
 * 代表一局，四圈为一局。这是游戏的基本过程单位
 * 
 * @author uu
 * @version 2011-2-27 下午09:34:18
 */
public final class Ju {
    
    /*
     * 4个游戏者
     */
    private AbstractPlayer[] players = new AbstractPlayer[4];
    
    /*
     * 1局4圈
     */
    private Quan[]           quans   = new Quan[4];
    
    /*
     * 此局已开始了的圈数
     */
    private int              startedQuanNum;
    
    /*
     * 此局是否已结束
     */
    private boolean          isFinished;
    
    public Ju(AbstractPlayer dong, AbstractPlayer nan, AbstractPlayer xi,
            AbstractPlayer bei) {
        players[0] = dong;
        players[1] = nan;
        players[2] = xi;
        players[3] = bei;
        dong.setMenfeng(Feng.DONG);
        nan.setMenfeng(Feng.NAN);
        xi.setMenfeng(Feng.XI);
        bei.setMenfeng(Feng.BEI);
    }
    
    /**
     * 得到所有的圈。有可能不够4圈，得到的最后一圈(不一定是第4圈)有可能并未结束。
     * 
     * @return 所有开始了的圈
     */
    public Quan[] getQuans() {
        Quan[] qs = new Quan[startedQuanNum];
        System.arraycopy(quans, 0, qs, 0, startedQuanNum);
        return qs;
    }

    /**
     * 当前圈。如果一圈也没开始，返回null。
     * 
     * @return 当前圈
     */
    public Quan currentQuan() {
        if (startedQuanNum == 0)
            return null;
        return quans[startedQuanNum - 1];
    }
    
    /**
     * 这一局开始新的一圈。返回null表示此局已结束。
     * 
     * @return 新的一圈
     */
    public Quan nextQuan() {
        if (startedQuanNum == 4) // 本局已打过4圈
            return null;
        Quan quan = new Quan(this, Feng.values()[startedQuanNum]); // 东南西北的牌号
        quans[startedQuanNum++] = quan;
        return quan;
    }
    
    /**
     * 判断本局是否已结束。已打4圈则结束
     * 
     * @return 本局是否已结束
     */
    public boolean isFinished() {
        return isFinished;
    }
    
    /*
     * 所有4个游戏者
     */
    AbstractPlayer[] getPlayers() {
        return players;
    }
    
    int getQuanNum() {
        return startedQuanNum;
    }
    
    void setFinished(boolean isFinished) {
        this.isFinished = isFinished;
    }
}
